
/**
 * 实现原理  with  + new Function
 */

const fs = require('fs').promises
const path = require('path')

async function renderFile(filePath, data) {
  let tmplStr = await fs.readFile(filePath, 'utf8')
  
  // js 的字符串形式
  // 用 反引号 就是 换行格式都带了
  let myTemplate = `let str = ''\r\n`
  myTemplate += 'with(obj){\r\n'
  myTemplate += 'str += `'
  // * + 量词后面使用 ? 表示非贪婪模式，尽可能少的匹配，
  tmplStr = tmplStr.replace(/<%=(.*?)%>/g, function() {
    return '${' + arguments[1] +'}'
  })

  myTemplate += tmplStr.replace(/<%(.*)%>/g, function() {
    return '`\r\n' + arguments[1] + '\r\nstr+=`'
  })
  myTemplate += '`}\r\n'
  myTemplate += 'return str'
  // obj 形参
  let fn = new Function('obj', myTemplate)
  return fn(data)
}

// 不用读取文件，每次根据传入的字符渲染
async function render(tmplStr, data) {
  let myTemplate = `let str = ''\r\n`
  myTemplate += 'with(obj){\r\n'
  myTemplate += 'str += `'
  tmplStr = tmplStr.replace(/<%=(.*?)%>/g, function() {
    return '${' + arguments[1] +'}'
  })

  myTemplate += tmplStr.replace(/<%(.*)%>/g, function() {
    return '`\r\n' + arguments[1] + '\r\nstr+=`'
  })
  myTemplate += '`}\r\n'
  myTemplate += 'return str'
  // obj 形参
  let fn = new Function('obj', myTemplate)
  return fn(data)
}


exports.render = render
exports.renderFile = renderFile
// renderFile(path.resolve(__dirname, 'tmpl.html'), {arr: [1,2,3,4]}).then(res => {
//   console.log(res)
// })